package lambdademo;

import java.util.Comparator;
import java.util.PriorityQueue;

/*************函数式接口***********/
//只能有一个方法
//无返回值无参数
@FunctionalInterface
interface NoParamterNoReturn {
    void test();
}
//无返回值一个参数
@FunctionalInterface
interface OneParamterNoReturn {
    void test(int a);
}
//无返回值多个参数
@FunctionalInterface
interface MoreParamterNoReturn {
    void test(int a, int b);
}

//有返回值无参数
@FunctionalInterface
interface NoParamterReturn {
    int test();
}
//有返回值一个参数
@FunctionalInterface
interface OneParamterReturn {
    int test(int a);
}
//有返回值多个参数
@FunctionalInterface
interface MoreParamterReturn {
    int test(int a, int b);
}

public class Test {

    public static void main4(String[] args) {

        //没有参数有返回值
//        NoParamterReturn noParamterReturn = () -> {
//            return 10;
//        };
        NoParamterReturn noParamterReturn = () -> 10;
        System.out.println(noParamterReturn.test());

        //一个参数有返回值
        OneParamterReturn oneParamterReturn = x -> x;
//        OneParamterReturn oneParamterReturn = (x) -> {
//            return x;
//        };
        System.out.println(oneParamterReturn.test(20));

        //多个参数有返回值
        MoreParamterReturn moreParamterReturn = (x, y) -> x + y;
//        MoreParamterReturn moreParamterReturn = (x, y) -> {
//            return x + y;
//        };
        System.out.println(moreParamterReturn.test(10, 20));
    }

    public static void main3(String[] args) {

        //lambda表达式
        //没有参数没有返回值
        NoParamterNoReturn noParamterNoReturn = () -> System.out.println("test");
        noParamterNoReturn.test();

        //一个参数没有返回值
//        OneParamterNoReturn oneParamterNoReturn = (x) -> {
//            System.out.println(x);
//        };
//        oneParamterNoReturn.test(10);
        OneParamterNoReturn oneParamterNoReturn = x -> System.out.println(x);
        oneParamterNoReturn.test(10);

        //多个参数没有返回值
//        MoreParamterNoReturn moreParamterNoReturn = (int x, int y) -> {
//            System.out.println(x + y);
//        };
//        moreParamterNoReturn.test(10, 20);
        MoreParamterNoReturn moreParamterNoReturn = (x, y) -> System.out.println(x + y);
        moreParamterNoReturn.test(10, 20);



    }

    public static void main2(String[] args) {
        //匿名内部类
        NoParamterNoReturn noParamterNoReturn = new NoParamterNoReturn() {
            @Override
            public void test() {
                System.out.println("test......");
            }
        };
        noParamterNoReturn.test();

        System.out.println("===");
        //lambda表达式
        NoParamterNoReturn noParamterNoReturn2 = () -> System.out.println("test");
        noParamterNoReturn2.test();

    }

    public static void main(String[] args) {
        int a = 10;
        //匿名内部类   中 只能使用常量或者不能被修改的变量
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {

                //a = 20;
                System.out.println(a);
                return o1 - o2;
            }
        });

        //lambda表达式
        PriorityQueue<Integer> priorityQueue1 = new PriorityQueue<>((o1, o2) -> {return o1 - o2;});
        //                      如果只有一条语句可以省略{return;}
        PriorityQueue<Integer> priorityQueue2 = new PriorityQueue<>((o1, o2) -> o1 - o2);
    }
}
